package com.wn.confirm;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * @author yellow Docter
 * @date 2023 -07-26
 * @desc 消息回退机制使用 lambda 表达式的写法
 */
//@Component
public class ProductConfirm01 {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void send(String msg){


        // 消息发布的回调机制 触发的函数 (消息到交换机的确认机制)
        /**
         * 参数1： correlationData–回调的相关数据
         *          correlationData.getReturnedMessage(); 可以拿到消息对象
         *
         * 参数2：是否确认收到消息
         *           ture   ack     收到 (交换机收到)
         *           false  nack
         * 参数3： cause –失败的原因
         */
        rabbitTemplate.setConfirmCallback(
                (CorrelationData correlationData, boolean ack, String cause)->{

                    System.out.println("回调的相关数据:correlationData = " + correlationData);
                    System.out.println("是否确认收到消息:ack = " + ack);
                    System.out.println("原因:cause = " + cause);

                    if (ack){  //true 消息 成功发送到 交换机中
                        System.out.println("消息到交换机中... = ");
                    }else{    //消息到交换机中失败
                        System.out.println("消息到交换机中...失败 ");
                        System.out.println("原因:cause = " + cause);
                        //消息失败

                        //存储到mysql中进行统一处理
                        //重新发送一次
                    }
                });

        //消息到 队列中的 回退机制
        //  true  消息的回退机制
        //  false 消息丢弃
        rabbitTemplate.setMandatory(true);
        //如果 消息通过路由 到队列中失败了 会触发下面的回调
        rabbitTemplate.setReturnCallback(
                (Message message, int replyCode, String replyText, String exchange, String routingKey)->{
                    System.out.println(" ========returnCallBack===========");
                    System.out.println("回退消息:message = " + message);
                    System.out.println("响应码:replyCode = " + replyCode);
                    System.out.println("回退原因:replyText = " + replyText);
                    System.out.println("交换机:exchange = " + exchange);
                    System.out.println("路由:routingKey = " + routingKey);
        });

        //消息发送
        rabbitTemplate.convertAndSend(
                "confirm-exchange",
                "confirm.msg12",
                msg
        );

    }
}
